package com.gskj.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.io.RepeatableFileInputStream;
import com.gskj.oss.service.IOssService;
import com.gskj.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @author :CodingFarmer_码农  Connor(康纳)_郭
 * @date : 13:50 20.5.15
 * @Company : http://www.gskj.com
 * @Version : 1.0
 */
@Service
public class OssServiceImpl implements IOssService {

    // 上传头像到 oss
    @Override
    public String uploadFileAvatar(MultipartFile file) {

        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = ConstantPropertiesUtils.END_POINT;

        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
        String bucket = ConstantPropertiesUtils.BUCKET_NAME;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 上传文件流。
        InputStream inputStream = null;
        try {
            inputStream = file.getInputStream();

            // 上传文件的名称
            String originalFilename = file.getOriginalFilename();

            // 获取唯一的文件名称标识 uuid
            String uuidStr = UUID.randomUUID().toString().replaceAll("-", "");

            //拼接到文件名称中
            originalFilename=uuidStr+originalFilename;

            // 使用工具类 ，按照年月日进行分类并创建文件夹  保存图片
            String formatDir =new DateTime().toString("yyyy/MM/dd");

            // 再次拼接上文件夹名称 ：2020-20-20/sss.jpg
            originalFilename=formatDir+"/"+originalFilename;


            // 调用 方法将照片上传到 oss
            // 参数1  bucket oss中存储实例
            // 参数2 保存的文件名+文件夹
            // 参数3 保存的文件流
            ossClient.putObject(bucket, originalFilename, inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            // 需要将 上传的头像在oss中保存的 url地址给拼接出，并返回到 controller
            //https://moster0506.oss-cn-shanghai.aliyuncs.com/3cf7197ea6564813a006fb84aeaee979.jpg
            String url = "https://" + bucket + "." + endpoint + "/" + originalFilename;
            return url;

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
